package com.atguigu.lease.common.config;

import com.atguigu.lease.common.handler.StgyAdminAuthInterceptor;
import com.atguigu.lease.common.handler.StgyAppAuthInterceptor;
import com.atguigu.lease.common.handler.StringToBaseTypeEnumConverterFactory;
import com.atguigu.lease.common.handler.StringToItemTypeEnumConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/*
    WebMvcConfigurer:
        mvc的配置类
        - 可以注册拦截器： Interceptor
        - 可以配置跨域：
        - 可以注册视图解析器
        - 可以注册消息转换器：

 */
@Configuration
public class StgyWebMvcConfig implements WebMvcConfigurer {
//    @Autowired
//    StringToItemTypeEnumConverter stringToItemTypeEnumConverter;
    @Autowired
    StringToBaseTypeEnumConverterFactory stringToBaseTypeEnumConverterFactory;
    @Autowired
    StgyAdminAuthInterceptor stgyAdminAuthInterceptor;
    @Autowired
    StgyAppAuthInterceptor stgyAppAuthInterceptor;
    //注册消息转换器
    @Override
    public void addFormatters(FormatterRegistry registry) {
        //注册消息转换器
//        registry.addConverter(stringToItemTypeEnumConverter);
        /*
            以后有多个场景 都可能会使用枚举类 当做属性，接受前端提交的参数、当做mp wrapper的属性值使用...
            枚举类不太一样
            如果每个枚举类都创建一个对应的 消息转换器、然后再注册 过于冗余
            解决： 可以使用mvc提供的消息转换器工厂
                > 1、可以为有共同特征的枚举类抽取父接口(将获取code值和获取name值的方法抽取到父接口中管理)
                    例如：
                        公寓房间 标签类型枚举： 1-公寓 2-房间
                        支付方式 支付类型枚举: 1-月付  2-季付  3-半年付
                > 2、创建消息转换器工厂：
                        可以根据父接口当做枚举类型
                        然后 工厂方法创建 消息转换器对象时，可以根据传入的参数 和 父类型所有的枚举对象实例 的code值进行比较 查找一个枚举对象返回
         */
        //注册工厂对象
        registry.addConverterFactory(stringToBaseTypeEnumConverterFactory);
    }
    //注册拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(stgyAdminAuthInterceptor)
                .addPathPatterns("/admin/**")//配置要拦截的路径 支持ant风格的url地址
                .excludePathPatterns("/admin/login/**","/doc.html") //配置要排除的 不拦截的路径
        ;

        registry.addInterceptor(stgyAppAuthInterceptor)
                .addPathPatterns("/app/**")
                .excludePathPatterns("/app/login/**");

    }

    //全局跨域配置
    @Override
    public void addCorsMappings(CorsRegistry registry) {
       /*
        允许所有的客户端 所有请求方式跨域访问接口
        */
        registry.addMapping("/**") //允许哪些资源被访问时 使用当前的跨域配置
                //.allowedOrigins("*") 不能使用  会报错！
                .allowedOriginPatterns("*") //允许哪些客户端来跨域访问  * 统配所有， 以后也可以在allowedOrigins中配置 http://192.168.123.1 指定具体的允许的服务器
                .allowedHeaders("*") //允许客户端携带的请求头
                .allowCredentials(true) //是否允许客户端携带cookie
                .maxAge(3600) //客户端可以跨域访问的一次授权的有效时间
                .allowedMethods("*");//允许客户端跨域访问的请求方式
    }
}
